#include <stdio.h>

#define N 32

int *p;
int k[N] = {};


// 判断一个数的X位是0还是1
void judgment_x(int x)
{
    printf("请输入一个数x,判断第x位的数字：");
    scanf("%d", &x);

    int *p = k + N;

    if (*(p - x) == 0)
    {
        printf("第%d位为:0\n", x);
    }
    else if (*(p - x) == 1)
    {
        printf("第%d位为:1\n", x);
    }
}

// 将一个数的X位置为0
void clear_x(int x)
{
    printf("请输入一个数x,将第x位的数字清零：");
    scanf("%d", &x);

    int *p = k + N;
    *(p - x) &= 0;
}

// 将一个数的x、x+1、x+2位，置为0，并依次修改为1 0 1
void clear_change(int x)
{
    int *p = k + N;

    printf("请输入一个数x,将第x位、x+1位和x+2位的数字清零：");
    scanf("%d", &x);

    for (int i = 0; i <= 2; i++)
    {
        *(p - (x + i)) &= 0;
    }

    printf("并将这三位的值置为：1 0 1\n");
    printf("修改后的结果为：");

    *(p - x) = 1;
    *(p - (x + 1)) = 0;
    *(p - (x + 2)) = 1;
}

// 将一个数的x和x+2位交换位置
void swap(int x)
{
    int *p = k + N;

    printf("请输入一个数x,将第x位、x+1位和x+2位的数字进行翻转：");
    scanf("%d", &x);

    for (int i = 0; i <= 2; i++)
    {
        int temp = *(p - x);
        *(p - x) = *(p - (x+2));
        *(p - (x+2)) = temp;
    }
}

// 输入一个正整数
void input()
{
    int n = 0;
    int count = 0;

    printf("请输入一个正整数：");
    scanf("%d", &n);

    for (n; n > 0; count++)
    {
        k[count] = n % 2;
        n = n / 2;
    }

    for (int i = 0; i < (sizeof(k) / sizeof(k[0])) / 2; i++)
    {
        int temp = k[i];
        k[i] = k[N - 1 - i];
        k[N - 1 - i] = temp;
    }
}

// 打印出一个数的二进制
void print()
{
    printf("二进制为：");
    int flag = 1;
    for (int i = 0; i < sizeof(k) / sizeof(k[0]); i++)
    {
        if (flag && k[i])
        {
            flag = 0;
        }
        if (flag == 1)
        {
            continue;
        }
        printf("%d", k[i]);
    }
    printf("\n");
}

int main(int argc, char const *argv[])
{
    int x1;

    input();

    print();

    judgment_x(x1);

    clear_x(x1);
    print();

    clear_change(x1);
    print();

    swap(x1);
    print();


    reswap 0;
}
